<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="keywords" content="spring,Spring,java,web,程序员,博客,IT,技术,移动开发,Web前端,企业架构,编程语言,互联网,数据库,技术博客,blog,分布式架构,分布式">
		<meta name="description" content="cdcoder是一个程序员学习交流平台，深度IT技术博客，移动开发博客,Web前端博客,企业架构博客,编程语言博客,互联网博客,数据库博客,IT blog,核心关注IT知识传播，共享。为更好的IT产业贡献一份微薄的力量。">
		<link rel="shortcut icon" href="/img/code.ico" />
		<link rel="bookmark" href="/img/code.ico" />
		<title>java相关知识</title>
		<link href="../css/index.css" rel="stylesheet">
		<style>
			body {
				font-size: 16px;
				font: 400 16px/1.62 Georgia, "Xin Gothic", "Hiragino Sans GB", "Droid Sans Fallback", "Microsoft YaHei", sans-serif;
				font-family: 'PT serif', 微軟正黑體, 微软雅黑, 华文细黑, Microsoft Yahei, Hiragino Sans GB, sans-serif;
				color: #D0CCCC;

				text-shadow: 0px 0px 1px rgba(24, 22, 22, 0.35);
				background-color: #000;
			}
				p{ text-indent:2em; padding:0px; margin:0px; }
		</style>
	</head>
	<body>

		<header>
			<div class="logo"><a href="/index.html">徐思润博客</a></div>
			<nav>
				<ul id="starlist">
					<li><a href="/java/index.html">java</a></li>
					<li><a href="/data/index.html">算法与数据结构</a></li>
					<li><a href="/db/mysql.html">数据库</a></li>
					<li><a href="/distribution/index.html">分布式</a></li>
					<li><a href="/framework/index.html">架构</a></li>
					<li><a href="/interview/index.html">面试与被面试</a></li>
					<li><a href="/live/index.html">日常生活</a></li>
					<li><a href="/about.html">关于我</a></li>
					<li><a href="/baby/index.html">baby墙</a></li>
				</ul>
			</nav>
		</header>
		<div class="box">
			<h1 style="text-align: center;">工厂方法模式（Factory Method）</h1>
			<h2>1.定义</h2>
			<p style="">又名生成器模式，是一种对象构建模式。它可以将复杂对象的建造过程抽象出来（抽象类别），使这个抽象过程的不同实现方法可以构造出不同表现（属性）的对象。</p>
			<h2>2.优点</h2>
			<p> 封装性，客户端不必知道产品内部组成的细节，将产品本身与产品的创建过程解耦，使得相同的创建过程可以创建不同的产品对象。</p>
			<p>每一个具体建造者都相对独立，而与其他的具体建造者无关，因此可以很方便地替换具体建造者或增加新的具体建造者， 用户使用不同的具体建造者即可得到不同的产品对象 。</p>
			<p>可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中，使得创建过程更加清晰，也更方便使用程序来控制创建过程。</p>
			<p>增加新的具体建造者无须修改原有类库的代码，指挥者类针对抽象建造者类编程，系统扩展方便，符合 “开闭原则”</p>
			<h2>3.缺点</h2>
			<p>需要为每一个类配备一个克隆方法，而且这个克隆方法需要对类的功能进行通盘考虑，这对全新的类来说不是很难，但对已有的类进行改造时，不一定是件容易的事，必须修改其源代码，违背了“开闭原则”。</p>
			<p>在实现深克隆时需要编写较为复杂的代码。</p>
			<h2>4.使用场景</h2>
			<p> 1.相同的方法，不同的执行顺序，生产不同的事件结果时。 </p>
			<p> 2.多个部件或者零件，可以装配到一个对象中，但是生产的运行结果又不同时</p>
			<p> 3.产品类非常复杂，或者产品类中的调用顺序不同生产了不同的效能</p>
			
				<h2>5容易混淆的地方</h2>
				<p>在日常的使用过程中，很多人很容易把建造者模式和工厂方法模式搞混淆，他们之间的区别是注重点不同，本模式的主要功能是基本方法的调用顺序安排，也就是基本方法是已经实现了的，不同顺序的
				基本方法执行后获得的对象是不同的，而工厂方法重点是去创建对象，不用去关系他的方法顺序和方法是否实现</p>
			<h2>6.类图</h2>
			<img src="https://picabstract-preview-ftn.weiyun.com/ftn_pic_abs_v3/fbcf4b3ec6ca79c242b65b91b56999fddc5d4032cea720f2d5f59f3a7f2ee35f629f90e2d01755d2b768ddc533a51ebe?pictype=scale&from=30113&version=3.3.3.3&uin=182478932&fname=factory-kit.jpg&size=750" />
			<p>Product（产品角色）：一个具体的产品对象。</p>
			<p>Builder（抽象建造者）：创建一个Product对象的各个部件指定的抽象接口。</p></p>
			<p>ConcreteBuilder（具体建造者）：实现抽象接口，构建和装配各个部件。</p>
			<p>Director（指挥者）：构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用，一是：隔离了客户与对象的生产过程，二是：负责控制产品对象的生产过程。</p>
			
		
			<h2>7.代码地址</h2>
			<p> 后面补上 </p>

			<a href="design_pattern.html">返回</a>
		</div>
		<footer>
			<p>Design by <a href="http://cdcoder.cn" target="_blank">徐思润个人博客</a> </p>
			<p>备案号：<a href="/">蜀ICP备15014105号-1</a></p>
				<script type="text/javascript" src="https://s96.cnzz.com/z_stat.php?id=1277229191&web_id=1277229191"></script>
		</footer>

	</body>
</html>
